package main

import "fmt"

func main() {
	/*
		指针：存储变量地址的变量
		定义指针 *type
		获取地址 &variable
	*/
	a := 10
	fmt.Printf("a的类型是：%T，地址是：%p\n", a, &a) //a的类型是：int，地址是：0xc000018080

	var pa *int = &a
	fmt.Printf("a的地址是：%v，pa的地址是：%p\n", pa, &pa) //a的地址是：0xc0000b2008，pa的地址是：0xc0000ac020

	//通过指针操作数值
	*pa = 20
	fmt.Printf("a的类值是：%d，地址是：%p\n", a, &a) //a的类值是：20，地址是：0xc000018080

	//指针的指针
	var pp **int
	pp = &pa
	fmt.Printf("pa的地址是：%v，pp的地址是：%p\n", pp, &pp) //pa的地址是：0xc00000e030，pp的地址是：0xc00000e038

	//数组指针
	arr := [...]int{1, 2, 3, 4}
	parr := &arr
	fmt.Printf("parr为：%v，arr地址为：%p，parr地址为：%p\n", parr, parr, &parr) //parr为：&[1 2 3 4]，arr地址为：0xc000116020，parr地址为：0xc000100030

	//使用指针操作数组
	(*parr)[0] = 100
	fmt.Println(arr) //[100 2 3 4]
	parr[0] = 200
	fmt.Println(arr) //[200 2 3 4]

	/*
		函数指针：复合类型本身就是指针
		指针函数：返回指针的函数
	*/
	pf := pointer()
	fmt.Printf("函数返回值是:%v\n", pf) //函数返回值是:0xc0000b2040
	*pf = 2
	fmt.Printf("函数返回值是:%v\n", pf)        //函数返回值是:0xc0000b2040
	fmt.Printf("函数返回值是:%v\n", pointer()) //函数返回值是:0xc0000b2040
}

func pointer() *int {
	a := 1
	return &a
}
